bzar
A Commando
The basic problem in package removal information is that it's not AFAIK supported by the current data model. Of course I'm talking about the backend implementation details here and not the protocol, but that's because the backend implementation in this case has implications on what is feasible in the protocol. Letting the client know what packages have been removed since $TIME would require either:
Keeping a log of package removals instead just the current state
This solution is not pretty, because there exists a possibility that an application has been removed and reuploaded within the update interval, which would require all removal log items be checked every time.
Keeping all package entries even after removal with a state "removed"
So far the best solution I can think of. Has potential problems with remove/reupload, but those should be very unlikely. If an application is uploaded when the entry already exists in "removed" state, it should replace the old entry. Of course this makes listing queries one argument more complicated (not removed). The actual data pointed by removed entries would of course be deleted. Has a possibility of collecting deprecated entries, but without the actual data they should be small enough to not become a problem. "Update timestamp" field would be rrepurposed to "status changed timestamp" field to accomodate update queries.
Sending the packages the client currently has to the server and comparing that to available applications
Not nice for obvious reasons, because it sends the client's package information to the server, which should not need to be done. Unnecessary sharing of information, web traffic and generally an ugly query. Also if the client has packages that never were in the repo, this solution would show them as removed.
OK, given that, I'd propose a "state" field instead of repurposing the version field, with possible states of "new", "updated", "removed". This would require two timestamps per application (addition, last status change), but has the added benefit of notifying users of new applications.
Keeping a log of package removals instead just the current state
This solution is not pretty, because there exists a possibility that an application has been removed and reuploaded within the update interval, which would require all removal log items be checked every time.
Keeping all package entries even after removal with a state "removed"
So far the best solution I can think of. Has potential problems with remove/reupload, but those should be very unlikely. If an application is uploaded when the entry already exists in "removed" state, it should replace the old entry. Of course this makes listing queries one argument more complicated (not removed). The actual data pointed by removed entries would of course be deleted. Has a possibility of collecting deprecated entries, but without the actual data they should be small enough to not become a problem. "Update timestamp" field would be rrepurposed to "status changed timestamp" field to accomodate update queries.
Sending the packages the client currently has to the server and comparing that to available applications
Not nice for obvious reasons, because it sends the client's package information to the server, which should not need to be done. Unnecessary sharing of information, web traffic and generally an ugly query. Also if the client has packages that never were in the repo, this solution would show them as removed.
OK, given that, I'd propose a "state" field instead of repurposing the version field, with possible states of "new", "updated", "removed". This would require two timestamps per application (addition, last status change), but has the added benefit of notifying users of new applications.