private ColumnInfo @NotNull [] generateColumnsInfo(@NotNull List<? extends VcsFullCommitDetails> commits) {
    ItemAndWidth hash = new ItemAndWidth("", 0);
    ItemAndWidth author = new ItemAndWidth("", 0);
    ItemAndWidth time = new ItemAndWidth("", 0);
    for (VcsFullCommitDetails commit : commits) {
      hash = getMax(hash, getHash(commit));
      author = getMax(author, getAuthor(commit));
      time = getMax(time, getTime(commit));
    }

    return new ColumnInfo[] {
      new CommitColumnInfo(DvcsBundle.message("column.commit.list.hash"), hash.myItem) {
        @Override
        public String valueOf(VcsFullCommitDetails commit) {
          return getHash(commit);
        }
      },
      new ColumnInfo<VcsFullCommitDetails, String>(DvcsBundle.message("column.commit.list.subject")) {
        @Override
        public String valueOf(VcsFullCommitDetails commit) {
          return commit.getSubject();
        }
      },
      new CommitColumnInfo(DvcsBundle.message("column.commit.list.author"), author.myItem) {
        @Override
        public String valueOf(VcsFullCommitDetails commit) {
          return getAuthor(commit);
        }
      },
      new CommitColumnInfo(DvcsBundle.message("column.commit.list.author.time"), time.myItem) {
        @Override
        public String valueOf(VcsFullCommitDetails commit) {
          return getTime(commit);
        }
      }
    };
  }
private ColumnInfo @NotNull [] generateColumnsInfo(@NotNull List<? extends VcsFullCommitDetails> commits)