topgit-0.19.7
tage1b1aef4933f3636b6243bbf8b562a91ed8d0afc
object 001bacffde24030175c1d7cd6429f31cd6be7c60
authorKyle J. McKay <mackyle@gmail.com>
Fri, 7 Apr 2017 00:40:41 +0000 (6 17:40 -0700)
TopGit-0.19.7
=============

Awking Awesome Acceleration!
----------------------------

It was supposed to be such a quick and simple update, surely it
would be done in no time at all.  And then it started growing...

**THE BIG AWKING CHANGE**

By moving the .topdeps traversal code into awk (strictly POSIX awk), everything
has become stupendously faster.  For example "tg summary --verbose --list" is
now nearly instant ("--verbose" is new and includes the subjects in the list).

The sole remaining bottlenecks are the git commands; generally checking for
some kind of branch containment (similar to "git branch --contains") or
performing actual merge operations themselves.

The results of branch containment checks continue to be cached and auto-updated
on an as-needed bases, but now with index-only merging support there's likely
little, if any, more water left to be squeezed out of the performance stone.

**NEW COMMAND**

"tg contains" (the original driver for this set of updates) shows what
TopGit branch a commit logically belongs to.   For example, after finding
something with "git log -S", passing the result to "tg contains" will show
which TopGit branch (if any) that commit logically belongs to (and where
any "fix" should therefore end up).

**POSIX MAKE INSTALLS**

While the tests still require gnumake, the build and installation now require
only a POSIX compatible make (and POSIX compatible utilities).

**UNIFIED "NEXT" AND "PREV" MEANINGS**

* The "tg prev" and "tg next" commands now show you exactly where the
  corresponding "tg checkout next" and "tg checkout prev" will take you.

* "tg info" understands new "--deps" and "--dependents" options if that's
  what was really wanted in the first place.

* A new "NAVIGATION" section has been added to the documentation with
  copious explanations and pictures explaining exactly what "next" and
  "prev" really are, where the alternate "push", "pop", "child" and "parent"
  terms come from and how to see the full patch series list or check it
  out using "tg info --series" or "tg checkout --series" (yup those are
  new too).

* Along with this overhaul, "tg checkout", "tg next" and "tg prev" got
  a few new options.  And, notabley, "tg checkout n" and "tg checkout p"
  are shortcuts for "tg checkout next" and "tg checkout prev" respectively
  (to use something else just employ the new "topgit.alias.*" functionality).

**OTHER UPDATES**

Not necessarily a comprehensive list here, but these are notable.

* Fixed a 0.19.6 bug when "tg update" was returning to a detached HEAD
  (If you never ran "tg update" with a detached HEAD you'd not see the bug)

* Using TopGit with "git worktree add" repositories should work better now

* "topgit.alias.*" now works for "tg" like "alias.*" works for "git"

* "tg summary" has a new column showing "needs merge" branches
  (these are the ones with changes that are causing others to be out-of-date)

* Both "tg create" and "tg update" now take a "--base" option (aka --no-deps
  for "tg create"), to simplify "[BASE]" TopGit branch setup and maintenance

* "tg update" now automatically just keeps going and going if "rerere.enabled"
  is true and "rerere" was able to resolve all merge conflicts

* tg checkout will pass along --ignore-other-worktrees (aka --iow), --force
  (aka -f), --quiet (aka -q) and/or --merge (aka -m) to git checkout now

* The "--heads" option now works as originally intended in various places

* "tg patch" can add a missing "From:" header to its output patch with --from
  ("git am" really, really, really doesn't like patches without "From:" lines)

* "tg" can now be used on read-only repositories!  The temporary trees some
  operations need now end up in an "alternate" object store that's removed
  when the command completes and while this temporary location is inside
  TopGit's temporary directory, that now auto-relocates elsewhere if the
  repository is read-only.  Obviously, "tg" commands that make changes still
  won't work on a read-only repository.  :)

* The ".topfiles" (i.e. .topdeps and .topmsg) are now kept out of the bases
  when merging updates from dependencies into the base.  They are not
  logically part of the base and this keeps the bases cleaner.  "tg create"
  now also makes sure the initial base has no ".topdeps" or ".topmsg" either
  which nicely cleans up the ugly diffs of one TopGit branch's .topfiles
  against another's in "git log -p" output.

* Merging remote branch updates into the local branch no longer quietly
  discards .topmsg and/or .topdeps changes from the remote branch version
  (previously they might have been picked up or might have been discarded)

* "tg log" now supports "--compact" and "--command=<cmd>" to use something
  other than plain "log" to show the log

* A new "--no-pager" global option for all "tg" commands works like Git's

* "tg tag" allows the first parent of a consolidation commit (if needed) to be
  explicitly selected

```
Kyle J. McKay (116):
      tg.sh: next version is 0.19.7
      tg.sh: st[atus] --help
      Makefile: support V=1
      test-lib-main.sh: when $HARNESS_ACTIVE use exit 0
      tg status: show upstream info and implement verbose
      tg.sh: verify_topgit_branch correctly for 'HEAD' on checked out base
      tg: improve multiple worktree support
      tg status: behave reasonably in a bare repository
      tests: support building and using helpers
      tests: add recurse_deps_internal helper
      tg.sh: add v_verify_topgit_branch function
      tg-checkout.sh: pass along a --force option to git checkout
      summary/revert: make --heads DWIM and add alternative
      tg-info.sh: make --heads work as intended
      t/helper/branch_needs_update.sh: needs_update testing helper
      tg-contains.sh: new command to show containing TopGit branch(es)
      tg-contains.sh: be cognizant of annihilated branches
      tg-info.sh: show dependents with --verbose
      tg-summary.sh: include new '*' "needs merge" column
      tg.sh: allow --top-bases to work outside a git dir
      tg.sh: add topgit.alias.* support
      tg-migrate-bases.sh: handle HEAD symrefs
      helpers: make -u option actually work and fix a usage typo
      test-lib-functions-tg.sh: introduce TopGit-specific test functions library
      testlib: add TEST_HELPER_DIRECTORY and some doc updates
      tg.sh: recurse_deps provide _dep_has_remote and early termination
      tg: avoid tree turds
      tg.sh: fallback to tmp dir outside .git
      tg.sh: quote problem alternate directory paths
      tg: avoid "not a valid object name" messages
      tg.sh: allow pretty_tree to accept any treeish ref
      tg-create.sh: create bases without .top* files
      tg-update.sh: after simple merge failure keep simple merges disabled
      tg-update.sh: improve .topdeps and .topmsg merge handling
      tg--index-merge-one-file.sh: be more or less --aggressive
      tg: refactor diff added lines extractor
      tg-update: automatically set up newly picked up remote deps
      tg-update.sh: repeat update when new dependencies picked up
      tg-update.sh: warn when a new non-existing dependency gets merged
      pre-commit.sh: limit hook's auto_create_local_remote activity
      Replace "tg-migrate-bases.sh: handle HEAD symrefs"
      tg-create.sh: use --base to create a [BASE] branch
      tg-update.sh: introduce --base mode
      tg-log.sh: omit --no-merges option for [BASE] branches
      tg-log.sh: support --compact and --command=<name> options
      Makefile: expand @AWK_PATH@ and @SHELL_PATH@ everywhere
      tg: the great LC_ALL=C out
      tg-create.sh: make "@" work properly as alias for HEAD
      tg: consolidate contained_by
      tg.sh: fix tg update --abort and clarify --stop
      tg: support --exec-path option
      t1200: add tests for index-merge-one-file merge-index helper
      tg: support $tgdisplayac for --abort/--continue display
      tg: replace $tg with tg() and export TG_EXPLICIT_REMOTE
      tg-update.sh: behave when --stop|--skip|--continue used out of update
      tg.sh: avoid multiple rev-parse --show-cdup calls
      tg-update.sh: give progress messages some structure
      tg: add missing --no-pager option
      tg.sh: include bad ref in ref_exists_rev failure message
      tg.sh: avoid schizophrenic caching
      tg.sh: use --no-deref when returning to a detached HEAD
      tg.sh: make checkout_symref_full -f really -f
      tg-update.sh: remove special case and allow auto rerere continue
      tg-update.sh: --aggressive optimizations
      tg.sh: add ensure_clean_topfiles
      tg-create.sh: make sure creation does not lose .topdeps or .topmsg
      tg-create.sh: prevent existing "clean" .topfiles from aborting creation
      tg-create.sh: word creation using "base" not "$topbases/"
      tg.sh: minor branch_needs_update efficiency
      Awking Awesome Acceleration!
      tg.sh: awksome accelerate recurse_deps_internal
      tg.sh: awksome accelerate non_annihilated_branches
      tg: add navigate_deps function and helper
      tg-summary.sh: awksome accelerate --heads
      tg.sh: preload .ref cache
      tg-info.sh: awksome accelerate --heads
      tg.sh: accelerate find_leaves a bit
      tg-summary.sh: miscellaneous small improvements
      tg-summary.sh: awksome accelerate --list --verbosely
      tg.sh: allow recurse_deps to pass options into run_awk_topgit_recurse
      tg-summary.sh: support --rdeps-once and --rdeps-full
      tg.sh: I hate bash bugs
      tg-patch.sh: get all awked up on --from
      tg-info.sh: introduce --series[=<head>] option
      tg-tag.sh: allow choosing a consolidation commit's first parent
      README: add an explicit TopGit alias example
      tg-checkout: push previous parent child terms aside to make next pop
      tg.sh: support global --no-pager option
      tg: awksome accelerate top-bases computation
      tg: awksome accelerate list_deps by banishing it
      tg-export.sh: use $_dep_annihilated not branch_annihilated function
      tg-checkout: awking awesome --series of overhauls
      tg-annihilate.sh: do not use `tg prev` or `tg next`
      tg-info.sh: support --deps and --dependents options
      tg: previous to next overhaul
      tg-update.sh: automatically set rerere.autoUpdate by default
      tg-info.sh: with --series=<name> HEAD may be detached
      t/Makefile: provide GNU make required hint
      t/Makefile: clean TG-TEST-SETTINGS too
      t/Makefile: nicety for test target aggregation when no results
      t/Makefile: compute TG-TEST-SETTINGS differently
      Makefile: switch to gnomake system
      Makefile: add dependencies
      t/helper/recurse_deps_internal: more correctly parse args
      tg: provide some debugging help with TG_DEBUG
      topgit: fully qualify more refs
      tg: alternatively not so much leaking
      tg-checkout.sh: pass on -q and -m to git
      tg-annihilate.sh: autostash and support --stash and --no-stash
      tg-delete.sh: autostash and support --stash and --no-stash
      tg-annihilate.sh: allow a name to be specified
      tg-update.sh: watch out for sneaky blobs
      tg-update.sh: word merge messages using "base" not "$topbases/"
      README: update to match current tg create behavior
      tg.sh: allow recursive tg invocations to reuse temporary dir
      tg.sh: create the ref cache dir hierarchy more efficiently
```
-----BEGIN PGP SIGNATURE-----

iQPcBAABAgAGBQJY5uAJAAoJEFh5SEJa2uvTuP0d/3X9PsQPbF2K9GcnYBxiLXid
fuHpOJYLP14hyR9RFgtWxtwcpPWILToNrIh61bh/W8nMBkznQ+wx6Sr5cTwx2d3F
G/mFUiSzU6Cofea2vvgrAnXsG9v3YHCKUfTLACUBx2+pX7c0t0Y3+8btBX1z59dh
2C5H9mPDjStzvZJsMQMbCoTJ3Dz8lCrWZUcmoxotGuA66rwdBaXbQBSIeRG1C9Jy
pY/eWuNAK+7B1R4SVC43CiANX/BryPswU3T7AVj708hfLpoZxEA8iwfnS6YIHfWN
Xr/PYSYJ2z9hmpjbhsi7OyqpHUif7GdyMOhfy3HxdD/VUV7ACTtsJbXqIrdjqLw5
afIRzSDpKP2Rb6BSiGzdYGeNLvIXQixkrr051ZK0thkEKH1rHe294gU5kZwDToIc
as8KYuWzHZiTX47rQAnP+OJ1M2ZL85paIZcd/8NOOLHoSNdcFK4iAZO82hQNl7Ge
ufpLGYmBU5Lj/Mvq4dByWI9bjj9BiW0UvDIReLJJ4gX9hEqrlxYGaz/wuaeUD78R
+bnqm7/fWX5UL5V6uglSprNQKn+JRwG6lL0Oz7HAIEhkGWsraXj0qPOyXdC0TpmO
vRnx2abfMquIp37OUBDyFlovFdcG++YpFaapPisPnR/+DNA7t1dPEpGBbjIXzOjy
W5WG+YvezyYbO/TK8y58ed8xpmLDS2iEM00YfWVFZbXjXTTl2ert2u2I7hr2ylnT
tQKB8jlLQ4FcX2zb7GUWo0g4xyUedAsDEBl37uoUMY8pAvfBm8OQUmrLFOB+waiW
vv4ggK1Mvkp83orJTTbiZx7c63HHJKyIE1Db/TyT50ILTSaUZ9Nrvcrl5ybDwuWV
6nciYhtPMAsh5yQzr/4Qh5KW6hhLG4VWpvZ2s6V/mkyONNg8dVaHZ3/kF/QTqrd3
NoTL5GePwFpnwOi49ndcnUZZCxvrFgcVRWGvVu11YA3MkwSX7kc1OcCovuWKyEbs
uMHsw+YVwamUZwChk2WjRynzVO8htTkXkC0Slhv095ovOl5EUIH/hOt3xmCdsTM4
Cuqbl7mmO+uz44LaR4FiX5DkyLNbPqGM5kx8My3f5U3e8OUmhLjbWoz04zau18nU
I9zdqEakcpXdSgXI52SruWXokHW85nSU2hO0IQJ+oMJVUcErkQcfdd9eh20186N7
uMPwKgVXmVGPn+tc6xb0ut+2hlSS+6ILLhhyHG7rPG7gjEPfOztOJvJke+rIq46d
jb7Npr8RpsFlVEYNPgH97Wh5eQKsCl6i9lrTYrgzGQ==
=xw95
-----END PGP SIGNATURE-----