17 using System.Collections.Generic;
19 using System.Globalization;
66 [DebuggerDisplay(
"{EID} {Location} {Status} {NamedVersion}")]
67 public sealed
class Element : IFormattable, IEquatable<Element>, IComparable<Element>, IComparable
69 #region class variables
70 private string _location;
72 private bool _executable;
76 private DateTime? _modTime;
77 private string _hierType;
78 private int _virStreamNumber;
79 private int _virVersionNumber;
80 private string _namedVersion;
81 private int _realStreamNumber;
82 private int _realVersionNumber;
83 private string _lapStream;
87 private string _timeBasedStream;
88 private string _status;
91 #region Equality comparison
101 if (ReferenceEquals(other, null))
return false;
102 if (ReferenceEquals(
this, other))
return true;
106 return left.Equals(right);
113 public override bool Equals(
object other)
115 if (ReferenceEquals(other, null))
return false;
116 if (ReferenceEquals(
this, other))
return true;
117 if (GetType() != other.GetType())
return false;
129 return hash.GetHashCode();
134 #region Order comparison
146 if (
Element.ReferenceEquals(
this, other))
160 int IComparable.CompareTo(
object other)
163 throw new ArgumentException(
"Argument is not an Element",
"other");
164 Element o = (Element)other;
175 get {
return _location ?? String.Empty; }
176 internal set { _location = value; }
184 get {
return _folder; }
185 internal set { _folder = value; }
194 get {
return _executable; }
195 internal set { _executable = value; }
204 internal set { _eid = value; }
212 get {
return _elementType; }
213 internal set { _elementType = value; }
222 get {
return _size; }
223 internal set { _size = value; }
231 get {
return _modTime; }
232 internal set { _modTime = value; }
240 get {
return _hierType ?? String.Empty; }
241 internal set { _hierType = value; }
249 get {
return _virStreamNumber; }
250 internal set { _virStreamNumber = value; }
258 get {
return _virVersionNumber; }
259 internal set { _virVersionNumber = value; }
267 get {
return _namedVersion ?? String.Empty; }
268 internal set { _namedVersion = value; }
276 get {
return _realStreamNumber; }
277 internal set { _realStreamNumber = value; }
285 get {
return _realVersionNumber; }
286 internal set { _realVersionNumber = value; }
296 get {
return _lapStream ?? String.Empty; }
297 internal set { _lapStream = value; }
314 get {
return _timeBasedStream ?? String.Empty; }
315 internal set { _timeBasedStream = value; }
323 get {
return _status ?? String.Empty; }
324 internal set { _status = value; }
328 public string ToString(
string format, IFormatProvider provider)
354 if (provider != null)
356 ICustomFormatter fmt = provider.GetFormat(this.GetType()) as ICustomFormatter;
358 return fmt.Format(format,
this, provider);
361 if (String.IsNullOrEmpty(format))
364 switch (format.ToUpperInvariant())
368 if (_modTime != null)
369 return $
"{Location}, {Status}{Environment.NewLine}" +
370 $
"\tEID: {EID} {{{ElementType}}}, Size: {Size}, ModTime: {ModTime},{Environment.NewLine}" +
371 $
"\t{NamedVersion}, Virtual: {VirStreamNumber}\\{VirVersionNumber}, Real: {RealStreamNumber}\\{RealVersionNumber}";
373 return $
"{Location}, {Status}{Environment.NewLine}" +
374 $
"\tEID: {EID} {{{ElementType}}}{Environment.NewLine}" +
375 $
"\t{NamedVersion}, Virtual: {VirStreamNumber}\\{VirVersionNumber}, Real: {RealStreamNumber}\\{RealVersionNumber}";
384 return EID.ToString();
388 return (
Size == null) ? String.Empty :
Size.ToString();
394 return $
"{VirStreamNumber}\\{VirVersionNumber}";
396 return $
"{RealStreamNumber}\\{RealVersionNumber}";
406 throw new FormatException($
"The {format} format string is not supported.");
411 public string ToString(
string format)
449 #region class variables
450 private static List<Element> _elements =
new List<Element>();
451 [NonSerialized]
private static readonly
object _locker =
new object();
457 public static List<Element>
Elements
459 get {
return _elements; }
460 private set { _elements = value; }
479 public static bool init(
string xml)
484 XElement elements = XElement.Parse(xml);
485 IEnumerable<XElement> query =
from e in elements.Elements(
"element")
486 where !e.Attribute(
"status").Value.Contains(
"no such elem")
488 foreach (XElement e
in query)
491 element.
Status = (string)e.Attribute(
"status") ?? String.Empty;
492 element.
Location = (string)e.Attribute(
"location") ?? String.Empty;
493 string dir = (string)e.Attribute(
"dir") ?? String.Empty;
494 element.
Folder = String.Equals(dir,
"yes");
495 string exe = (string)e.Attribute(
"executable") ?? String.Empty;
496 element.
Executable = String.Equals(exe,
"yes");
497 element.
EID = (
int?)e.Attribute(
"id") ?? 0;
499 element.
Size = (
long?)e.Attribute(
"size");
500 element.
ModTime = e.acxTime(
"modTime");
501 element.
HierType = (string)e.Attribute(
"hierType") ?? String.Empty;
503 string vir = (string)e.Attribute(
"Virtual") ?? String.Empty;
504 if (!String.IsNullOrEmpty(vir))
506 string[] arrVir = vir.Split(
'\\');
507 if (Int32.TryParse(arrVir[0], NumberStyles.Integer, null, out ival))
509 if (Int32.TryParse(arrVir[1], NumberStyles.Integer, null, out ival))
512 element.
NamedVersion = (string)e.Attribute(
"namedVersion") ?? String.Empty;
513 string real = (string)e.Attribute(
"Real") ?? String.Empty;
514 if (!String.IsNullOrEmpty(real))
516 string[] arrReal = real.Split(
'\\');
517 if (Int32.TryParse(arrReal[0], NumberStyles.Integer, null, out ival))
519 if (Int32.TryParse(arrReal[1], NumberStyles.Integer, null, out ival))
522 element.
LapStream = (string)e.Attribute(
"overlapStream") ?? String.Empty;
523 element.
TimeBasedStream = (string)e.Attribute(
"timeBasisStream") ?? String.Empty;
524 lock (_locker) { _elements.Add(element); }
530 catch (Exception ecx)
532 AcDebug.
Log($
"Exception caught and logged in Stat.init{Environment.NewLine}{ecx.Message}");
555 Debug.Assert(version.Name ==
"version",
@"version.Name == ""version""");
556 int? virEID = (
int?)version.Attribute(
"eid");
557 if (virEID == null)
return null;
559 int[] virStreamVersion = version.acxStreamVersion(
RealVirtual.Virtual);
560 if (virStreamVersion == null)
return null;
561 int[] realStreamVersion = version.acxStreamVersion(
RealVirtual.Real);
562 if (realStreamVersion == null)
return null;
564 string virStream = version.acxStreamName(
RealVirtual.Virtual);
565 if (virStream == null)
return null;
566 string realStream = version.acxStreamName(
RealVirtual.Real);
567 if (realStream == null)
return null;
569 IEnumerable<Element> query =
from e in _elements
570 where e.EID == virEID &&
571 e.VirStreamNumber == virStreamVersion[0] && e.VirVersionNumber == virStreamVersion[1] &&
572 e.RealStreamNumber == realStreamVersion[0] && e.RealVersionNumber == realStreamVersion[1] &&
573 (e.NamedVersion.StartsWith(virStream) || e.NamedVersion.StartsWith(realStream))
575 return query.FirstOrDefault();
static bool init(string xml)
Populate this list with elements from the XML emitted by the stat command.
long Size
File size in bytes.
ElementType ElementType
The element's type: dir, text, binary, ptext, elink, or slink.
int RealStreamNumber
Real stream number.
ElementType
Indicates the element's type. By default, AccuRev determines the element type for a newly created ver...
static void clear()
Remove all elements from the (static) element's list.
override bool Equals(object other)
Overridden to determine equality.
string HierType
"Hierarchy type" of the element: parallel or serial.
string Status
The version's status, e.g. (kept)(member)
string NamedVersion
Named stream\version number designation, e.g. MARS_MAINT3\17 or MARS_MAINT3_barnyrd\22 ...
int CompareTo(Element other)
Generic IComparable implementation (default) for comparing Element objects to sort by element locatio...
int VirVersionNumber
Virtual version number.
bool Equals(Element other)
IEquatable implementation to determine the equality of instances of type Element.
static void Log(string message, bool formatting=true)
Write the message text to STDOUT, to weekly log files located in %LOCALAPPDATA%\AcTools\Logs, and to trigger.log in the AccuRev server's ..storage\site_slice\logs folder in the case of triggers.
int VirStreamNumber
Virtual stream number.
string Location
Depot-relative path of the element.
static Element getElement(XElement version)
Get the stat command's Element object from this list that corresponds to the version element in a tra...
DateTime ModTime
The element's modification time.
Defines the attributes of an element from the stat command.
int RealVersionNumber
Real version number.
string TimeBasedStream
Name of the first time-based stream found when stat -s -o -B -fox is used to retrieve elemen...
string LapStream
Stream where the element is located when it has (underlap)(member) or (overlap)(member) status...
bool Folder
true if the element is a folder, false otherwise.
Use to log and display error and general purpose text messages, and to save the XML param data sent b...
bool Executable
UNIX/Linux systems only: true if the executable bit is set, false if cleared.
RealVirtual
Use to specify real or virtual values.
string ToString(string format, IFormatProvider provider)
The ToString implementation.
static List< Element > Elements
The list of Element objects.
The list of Element objects from the stat command.
override int GetHashCode()
Override appropriate for type Element.