git annex adjust and git annex view (et all) both derive a branch from the main branch and enter it. They have different capabilies. It would be useful to be able to compose them. For example, to enter a view based on metadata that also has all files unlocked. --Joey

Now that git-annex sync supports view branches, this is more apparently a problem.

It's possible to check out a view branch, and then git-annex adjust --unlock, and the result will be a view branch with unlocked files. But then git-annex sync doesn't work; it neither syncs back to the parent view branch, nor all the way back to the parent master branch. It seems that git-annex gets confused about what this strangely named branch is ("adjusted/views/master(author=_)(unlocked)"), and does not treat it as either kind of branch.

Conversely, first doing git-annex adjust --unlock, followed by checking out a view branch from there results in a view branch that does not have the files unlocked. ("views/adjusted/master(unlocked)(author=_)"). And syncing fails from there:

fatal: not a valid object name: 'adjusted/master'

git-annex: failed to update refs/heads/synced/adjusted/master

There's also probably a fair amount of overlap in their implementations.

I now think not really so much. View branches are constructed using a temporary index file (and need it), while adjusted branches are able to stream to git mktree.

The main overlap is that there is a basis branch that gets transformed to a new branch. And a way for git-annex sync to update the branch when the basis branch (or other info) changes.


Consider a branch that is a view branch, where git-annex adjust --hide-missing was then run. After git-annex drop, updating the adjusted branch should cause the dropped file to be removed. But removing a file from a view branch means removing that metadata from the object.

So, it seems that composing that kind of adjusted branch with view branches is unlikely to work.


Considering all the the above, I think this would be a good plan:

Implemented adjusted view branches. Not views of adjusted branches. Although running git-annex adjust with a view branch checked out could be one way to get into an adjusted view branch. Or running git-annex view with an adjusted branch checked out.

Prohibit entering a view branch with the --hide-missing adjustment. Update: Actually, I was able to implement support for that adjustment that seems to work ok in a view branch.

Building the branch seems simple: Construct the view branch like it does now, using the master branch as the basis. And apply the adjustment to each file that gets added to it.

It seems it would make sense for an adjusted view branch to have a name like "views/adjusted/master(unlocked)(author=_)" if that can be parsed unambiguously. Update: Actually "adjusted/views/master(author=_)(unlocked)" worked better.

When git-annex sync runs in an adjusted view branch, it does not need to do the usual adjusted branch propagation at all. Because the only change that gets synced from a view branch is changes to metadata.

done! --Joey