def uncheckoutResource(self, object): info = self.getVersionInfo(object) if info.status != info.CHECKED_OUT: raise VersionControlError( 'The selected resource is not checked out.' ) history = self.getVersionHistory(info.history_id) ob_path = _findPath(object) version = history.getVersionById(info.version_id) new_obj = version.copyState() # Save an audit record of the action being performed. history.addLogEntry(info.version_id, LogEntry.ACTION_UNCHECKOUT, ob_path ) # Replace the state of the object with a reverted state. new_obj = self.replaceState(object, new_obj) # Update bookkeeping information. newinfo = info.clone() newinfo.version_id = version.getId() newinfo.status = newinfo.CHECKED_IN new_obj.__vc_info__ = newinfo return new_obj
def checkoutResource(self, object): info = self.getVersionInfo(object) if info.status != info.CHECKED_IN: raise VersionControlError( 'The selected resource is already checked out.' ) if info.sticky and info.sticky[0] != 'B': raise VersionControlError( 'The selected resource has been updated to a particular ' 'version, label or date. The resource must be updated to ' 'the mainline or a branch before it may be checked out.' ) if not self.isResourceUpToDate(object): raise VersionControlError( 'The selected resource is not up to date!' ) history = self.getVersionHistory(info.history_id) ob_path = _findPath(object) # Save an audit record of the action being performed. history.addLogEntry(info.version_id, LogEntry.ACTION_CHECKOUT, ob_path ) # Update bookkeeping information. newinfo = info.clone() newinfo.status = newinfo.CHECKED_OUT object.__vc_info__ = newinfo return object
def checkinResource(self, object, message=''): info = self.getVersionInfo(object) if info.status != info.CHECKED_OUT: raise VersionControlError( 'The selected resource is not checked out.') if info.sticky and info.sticky[0] != 'B': raise VersionControlError( 'The selected resource has been updated to a particular ' 'version, label or date. The resource must be updated to ' 'the mainline or a branch before it may be checked in.') if not self.isResourceUpToDate(object): raise VersionControlError( 'The selected resource is not up to date!') history = self.getVersionHistory(info.history_id) ob_path = _findPath(object) branch = 'mainline' if info.sticky is not None and info.sticky[0] == 'B': branch = info.sticky[1] version = history.createVersion(object, branch) # Save an audit record of the action being performed. history.addLogEntry(version.getId(), LogEntry.ACTION_CHECKIN, ob_path, message) # Update bookkeeping information. newinfo = info.clone() newinfo.version_id = version.getId() newinfo.status = newinfo.CHECKED_IN object.__vc_info__ = newinfo return object
def checkinResource(self, object, message=''): info = self.getVersionInfo(object) if info.status != info.CHECKED_OUT: raise VersionControlError( 'The selected resource is not checked out.' ) if info.sticky and info.sticky[0] != 'B': raise VersionControlError( 'The selected resource has been updated to a particular ' 'version, label or date. The resource must be updated to ' 'the mainline or a branch before it may be checked in.' ) if not self.isResourceUpToDate(object): raise VersionControlError( 'The selected resource is not up to date!' ) history = self.getVersionHistory(info.history_id) ob_path = _findPath(object) branch = 'mainline' if info.sticky is not None and info.sticky[0] == 'B': branch = info.sticky[1] version = history.createVersion(object, branch) # Save an audit record of the action being performed. history.addLogEntry(version.getId(), LogEntry.ACTION_CHECKIN, ob_path, message ) # Update bookkeeping information. newinfo = info.clone() newinfo.version_id = version.getId() newinfo.status = newinfo.CHECKED_IN object.__vc_info__ = newinfo return object
def applyVersionControl(self, object, message=None): if self.isUnderVersionControl(object): raise VersionControlError( 'The resource is already under version control.' ) if not self.isAVersionableResource(object): raise VersionControlError( 'This resource cannot be put under version control.' ) # Need to check the parent to see if the container of the object # being put under version control is itself a version-controlled # object. If so, we need to use the branch id of the container. branch = 'mainline' parent = aq_parent(aq_inner(object)) p_info = getattr(parent, '__vc_info__', None) if p_info is not None: sticky = p_info.sticky if sticky and sticky[0] == 'B': branch = sticky[1] # Create a new version history and initial version object. history = self.createVersionHistory(object) version = history.createVersion(object, branch) history_id = history.getId() version_id = version.getId() # Add bookkeeping information to the version controlled object. info = VersionInfo(history_id, version_id, VersionInfo.CHECKED_IN) if branch != 'mainline': info.sticky = ('B', branch) object.__vc_info__ = info # Save an audit record of the action being performed. history.addLogEntry(version_id, LogEntry.ACTION_CHECKIN, _findPath(object), message is None and 'Initial checkin.' or message ) return object
def updateResource(self, object, selector=None): info = self.getVersionInfo(object) if info.status != info.CHECKED_IN: raise VersionControlError( 'The selected resource must be checked in to be updated.' ) history = self.getVersionHistory(info.history_id) version = None sticky = info.sticky if not selector: # If selector is null, update to the latest version taking any # sticky attrs into account (branch, date). Note that the sticky # tag could also be a date or version id. We don't bother checking # for those, since in both cases we do nothing (because we'll # always be up to date until the sticky tag changes). if sticky and sticky[0] == 'L': # A label sticky tag, so update to that label (since it is # possible, but unlikely, that the label has been moved). version = history.getVersionByLabel(sticky[1]) elif sticky and sticky[0] == 'B': # A branch sticky tag. Update to latest version on branch. version = history.getLatestVersion(selector) else: # Update to mainline, forgetting any date or version id # sticky tag that was previously associated with the object. version = history.getLatestVersion('mainline') sticky = None else: # If the selector is non-null, we find the version specified # and update the sticky tag. Later we'll check the version we # found and decide whether we really need to update the object. if history.hasVersionId(selector): version = history.getVersionById(selector) sticky = ('V', selector) elif self._labels.has_key(selector): version = history.getVersionByLabel(selector) sticky = ('L', selector) elif self._branches.has_key(selector): version = history.getLatestVersion(selector) if selector == 'mainline': sticky = None else: sticky = ('B', selector) else: try: date = DateTime(selector) except: raise VersionControlError( 'Invalid version selector: %s' % selector ) else: timestamp = date.timeTime() sticky = ('D', timestamp) # Fix! branch = history.findBranchId(info.version_id) version = history.getVersionByDate(branch, timestamp) # If the state of the resource really needs to be changed, do the # update and make a log entry for the update. version_id = version and version.getId() or info.version_id new_object = object if version and (version_id != info.version_id): new_object = version.copyState() new_object = self.replaceState(object, new_object) history.addLogEntry(version_id, LogEntry.ACTION_UPDATE, _findPath(new_object) ) # Update bookkeeping information. newinfo = info.clone(1) newinfo.version_id = version_id newinfo.status = newinfo.CHECKED_IN if sticky is not None: newinfo.sticky = sticky new_object.__vc_info__ = newinfo return new_object