This place is dedicated to projman, a python script for propagating files and keeping them
up-to-date between different physical supports.
I started working on projman around 2000 and used it for a while for my own files,
then around 2010 I abandonned the idea.
In 2020 I decided to resume its development.
git is a well-known software which can be viewed as a competitor of projman
(or the other way around, if you wish), so I will try to give a quick idea about what projman
is and does by comparing it to git.
There are two main flavors of projman : with tracking activated and with no tracking.
-
gitkeeps old versions of the files,projmandoes not. Thus, there are no branches inprojman. -
gitoffers operationspullandpush. Inprojmanthere is only one such operation, calledsync. -
gitregisters changes in a two-stage process (which I find slightly confusing) :addthencommit. Inprojmanthere is only one stage calledregister. -
Operations
git commit -aandgit statusdetect changes by analysing the content of all files in the current directory, including subdirectories,projmannever looks inside the files, so it cannot detect changes (if tracking is off). -
You need to inform
gitabout changes to a file after you have edited (and saved) your file. You change it again, you have toaddit again togit. Withprojman, you give this information only once, before or after you modify the file. Again,projmannever looks inside the files, so it does not matter if you have already saved the file or if you make further changes later. There is no such thing ascommit -ainprojman(if tracking is off). Of course, you must save all edited files before yousyncthem to some other physical support. Also, after asyncoperation, you mustregisterany new changes again. -
When propagating changes,
gittries to solve conflicts through a tree-waydiff.projmannever looks inside the files, it only uses a system of tokens describing the modification history of each file. If changes have been made to the same file on different repositories,projmanwill bluntly report a conflict which you will have to solve manually. -
projmantreats a whole directory as one file only, that is, whensynchronizing, it looks at the tokens describing the modification history of that directory and if it finds that they are up-to-date, it does not descend into that directory for further analysis. So, for instance, if you give asynccommand between two mirrors of the same project which are up-to-date,projmanis extremely fast in deciding not to take any action because it only compares tokens relative to the root directory. I guessgitis similar in that respect. -
If tracking is off,
projmannever looks at timestamps of files or at the current time, so there is no need to synchronize clocks. I believegitis similar in that respect.
-
gitkeeps old versions of the files,projmandoes not. Thus, there are no branches inprojman. -
gitoffers operationspullandpush. Inprojmanthere is only one such operation, calledsync. -
gitregisters changes in a two-stage process (which I find slightly confusing) :addthencommit(or the shortcutcommit -a). Inprojmanthere is only one stage calledregisterbut it is seldom used if tracking is active.git commit -ais roughly equivalent to doing nothing inprojmanif tracking is active. -
Just as for
.gitignore, the file.projman/ignoreis important for controlling what will be propagated. -
Operations
git commit -aandgit statusdetect changes by analysing the content of all files in the current directory, including subdirectories.projmannever looks inside the files, but (if tracking is active) it does compare file timestamps with the time of the latestsyncoperation. If the timestamp of a directory is older than the latestsync, it will not analyse further timestamps of files therein (but it will descend into subdirectories). However,projmannever compares timestamps between remote machines, so there is no need to synchronize clocks. -
When propagating changes,
gittries to solve conflicts through a tree-waydiff.projmannever looks inside the files, it only uses a system of tokens. If changes have been made to the same file on different repositories,projmanwill bluntly report a conflict which you will have to solve manually. -
projmantreats a whole directory as one file only, that is, whensynchronizing, it looks at the tokens describing the modification history of that directory and if it finds that they are up-to-date, it does not descend into that directory for further analysis. So, for instance, if you give asynccommand between two mirrors of the same project which are up-to-date,projmanis extremely fast in deciding not to take any action because it only compares tokens relative to the root directory. I guessgitis similar in that respect.
projman should be useful for maintaining large collections
of files with many subdirectories, when different people make changes independently
of each other but rarely on the same file.
The size of individual files has no impact on projman's performance, only their number
(on a logarithmic scale if they are well distributed in a tree of directories).
Binary files are welcome, projman does not use diff
(actually it never looks at the content of the files).
projman does not keep track of previous versions of your files;
if you want that I guess you could somehow use projman on top of CVS but I'm not sure.
I wrote projman in python2, so I guess my first move should be to translate it to python3.
This may take some time.
Don't look for the source file, I haven't published it yet.