Skip to content

Commit c8a2bb2

Browse files
authored
docs: more intra-doc links (#2077)
* docs: `cargo intraconv` for more intra-doc links ... also it deleted some redundant ones, and it got some things wrong, and it was gonna delete some of the cross-crate docs.rs links we can't do as intra-doc links so I passed `--no-favored`. * docs: convert https:// links to std/core/alloc to intra-doc links Note that this adds some more broken intra doc links when building without std support, but that was already a thing and I expect people who build their own docs without std support can handle it. This time I gave up on sed and used ruby. find -name '*.rs' -exec ruby -i -p blah.rb {} + with $_.gsub!(%r{ https://doc\.rust-lang\.org/ (?: stable/)? ((?:core | std | alloc)(?:/\S+?)*) /(\w+)\.(\w+)\.html}x ) { path, kind, name = $~.captures suffix = case kind when 'method' then '()' when 'macro' then '!' else '' end r = [path.gsub('/', '::'), '::', name, suffix].join STDERR.puts [path, kind, name, suffix, r].inspect r } $_.gsub!(%r{ https://doc\.rust-lang\.org/ (?: stable/)? ((?: core | std | alloc)(?:/\S+?)*) /(?: index\.html | $ | (?= \#) )}x ) { path, _ = $~.captures r = path.gsub('/', '::') STDERR.puts [path, r].inspect r } * docs: more cross-crate intra-doc links cargo intraconv doesn't seem to get them reliably and also plenty of links to other crates aren't actually intra-doc because they're in crates that don't depend (or only dev-depend, or only conditionally depend) on those crates, so this wasn't very automated. I tried to only convert docs.rs links to unconditional dependencies to intra-crate links, but it's possible that some slipped through in either direction.
1 parent 4f1e463 commit c8a2bb2

File tree

39 files changed

+176
-263
lines changed

39 files changed

+176
-263
lines changed

tracing-appender/src/lib.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -89,12 +89,11 @@
8989
//! The [`non_blocking` module][non_blocking]'s documentation provides more detail on how to use `non_blocking`.
9090
//!
9191
//! [non_blocking]: mod@non_blocking
92-
//! [write]: https://doc.rust-lang.org/std/io/trait.Write.html
92+
//! [write]: std::io::Write
9393
//! [guard]: non_blocking::WorkerGuard
94-
//! [rolling]: rolling
95-
//! [make_writer]: https://docs.rs/tracing-subscriber/latest/tracing_subscriber/fmt/trait.MakeWriter.html
94+
//! [make_writer]: tracing_subscriber::fmt::MakeWriter
9695
//! [rolling_struct]: rolling::RollingFileAppender
97-
//! [fmt_subscriber]: https://docs.rs/tracing-subscriber/latest/tracing_subscriber/fmt/struct.Subscriber.html
96+
//! [fmt_subscriber]: tracing_subscriber::fmt::Subscriber
9897
//!
9998
//! ## Non-Blocking Rolling File Appender
10099
//!

tracing-appender/src/non_blocking.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,6 @@ pub const DEFAULT_BUFFERED_LINES_LIMIT: usize = 128_000;
7878
/// terminates abruptly (such as through an uncaught `panic` or a `std::process::exit`), some spans
7979
/// or events may not be written.
8080
///
81-
/// [`NonBlocking`]: NonBlocking
8281
/// Since spans/events and events recorded near a crash are often necessary for diagnosing the failure,
8382
/// `WorkerGuard` provides a mechanism to ensure that _all_ buffered logs are flushed to their output.
8483
/// `WorkerGuard` should be assigned in the `main` function or whatever the entrypoint of the program is.
@@ -121,8 +120,8 @@ pub struct WorkerGuard {
121120
/// crate. Therefore, it can be used with the [`tracing_subscriber::fmt`][fmt] module
122121
/// or with any other subscriber/layer implementation that uses the `MakeWriter` trait.
123122
///
124-
/// [make_writer]: https://docs.rs/tracing-subscriber/latest/tracing_subscriber/fmt/trait.MakeWriter.html
125-
/// [fmt]: https://docs.rs/tracing-subscriber/latest/tracing_subscriber/fmt/index.html
123+
/// [make_writer]: tracing_subscriber::fmt::MakeWriter
124+
/// [fmt]: mod@tracing_subscriber::fmt
126125
#[derive(Clone, Debug)]
127126
pub struct NonBlocking {
128127
error_counter: ErrorCounter,

tracing-appender/src/rolling.rs

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,6 @@
1717
//! will be created daily
1818
//! - [`Rotation::never()`][never()]: This will result in log file located at `some_directory/log_file_name`
1919
//!
20-
//! [minutely]: minutely
21-
//! [hourly]: hourly
22-
//! [daily]: daily
23-
//! [never]: never
2420
//!
2521
//! # Examples
2622
//!
@@ -126,10 +122,6 @@ impl RollingFileAppender {
126122
/// - [`Rotation::daily()`][daily],
127123
/// - [`Rotation::never()`][never()]
128124
///
129-
/// [minutely]: minutely
130-
/// [hourly]: hourly
131-
/// [daily]: daily
132-
/// [never]: never
133125
///
134126
/// # Examples
135127
/// ```rust

tracing-attributes/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -501,7 +501,7 @@ mod expand;
501501
/// [`INFO`]: https://docs.rs/tracing/latest/tracing/struct.Level.html#associatedconstant.INFO
502502
/// [empty field]: https://docs.rs/tracing/latest/tracing/field/struct.Empty.html
503503
/// [field syntax]: https://docs.rs/tracing/latest/tracing/#recording-fields
504-
/// [`fmt::Debug`]: https://doc.rust-lang.org/std/fmt/trait.Debug.html
504+
/// [`fmt::Debug`]: std::fmt::Debug
505505
#[proc_macro_attribute]
506506
pub fn instrument(
507507
args: proc_macro::TokenStream,

tracing-core/src/dispatcher.rs

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -123,11 +123,6 @@
123123
//! currently default `Dispatch`. This is used primarily by `tracing`
124124
//! instrumentation.
125125
//!
126-
//! [`Subscriber`]: Subscriber
127-
//! [`with_default`]: with_default
128-
//! [`set_global_default`]: set_global_default
129-
//! [`get_default`]: get_default
130-
//! [`Dispatch`]: Dispatch
131126
use crate::{
132127
callsite, span,
133128
subscriber::{self, NoSubscriber, Subscriber},
@@ -151,7 +146,6 @@ use crate::stdlib::{
151146

152147
/// `Dispatch` trace data to a [`Subscriber`].
153148
///
154-
/// [`Subscriber`]: Subscriber
155149
#[derive(Clone)]
156150
pub struct Dispatch {
157151
subscriber: Arc<dyn Subscriber + Send + Sync>,
@@ -579,7 +573,7 @@ impl Dispatch {
579573
/// [`Subscriber`]: super::subscriber::Subscriber
580574
/// [`drop_span`]: super::subscriber::Subscriber::drop_span
581575
/// [`new_span`]: super::subscriber::Subscriber::new_span
582-
/// [`try_close`]: #method.try_close
576+
/// [`try_close`]: Entered::try_close()
583577
#[inline]
584578
#[deprecated(since = "0.1.2", note = "use `Dispatch::try_close` instead")]
585579
pub fn drop_span(&self, id: span::Id) {

tracing-core/src/field.rs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,6 @@
100100
//! [`record_value`]: Visit::record_value
101101
//! [`record_debug`]: Visit::record_debug
102102
//!
103-
//! [`Value`]: Value
104103
//! [span]: super::span
105104
//! [`Event`]: super::event::Event
106105
//! [`Metadata`]: super::metadata::Metadata
@@ -110,7 +109,6 @@
110109
//! [`record`]: super::subscriber::Subscriber::record
111110
//! [`event`]: super::subscriber::Subscriber::event
112111
//! [`Value::record`]: Value::record
113-
//! [`Visit`]: Visit
114112
use crate::callsite;
115113
use crate::stdlib::{
116114
borrow::Borrow,
@@ -249,13 +247,11 @@ pub struct Iter {
249247
/// <code>std::error::Error</code> trait.
250248
/// </pre></div>
251249
///
252-
/// [`Value`]: Value
253250
/// [recorded]: Value::record
254251
/// [`Subscriber`]: super::subscriber::Subscriber
255252
/// [records an `Event`]: super::subscriber::Subscriber::event
256253
/// [set of `Value`s added to a `Span`]: super::subscriber::Subscriber::record
257254
/// [`Event`]: super::event::Event
258-
/// [`ValueSet`]: ValueSet
259255
pub trait Visit {
260256
/// Visits an arbitrary type implementing the [`valuable`] crate's `Valuable` trait.
261257
///

tracing-core/src/metadata.rs

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,13 @@ use crate::stdlib::{
4747
///
4848
/// [span]: super::span
4949
/// [event]: super::event
50-
/// [name]: #method.name
51-
/// [target]: #method.target
52-
/// [fields]: #method.fields
53-
/// [verbosity level]: #method.level
54-
/// [file name]: #method.file
55-
/// [line number]: #method.line
56-
/// [module path]: #method.module
50+
/// [name]: Metadata::name()
51+
/// [target]: Metadata::target()
52+
/// [fields]: Metadata::fields()
53+
/// [verbosity level]: Metadata::level()
54+
/// [file name]: Metadata::file()
55+
/// [line number]: Metadata::line()
56+
/// [module path]: Metadata::module_path()
5757
/// [`Subscriber`]: super::subscriber::Subscriber
5858
/// [`id`]: Metadata::id
5959
/// [callsite identifier]: super::callsite::Identifier
@@ -604,8 +604,7 @@ impl LevelFilter {
604604
/// Returns the most verbose [`Level`] that this filter accepts, or `None`
605605
/// if it is [`OFF`].
606606
///
607-
/// [`Level`]: super::Level
608-
/// [`OFF`]: #associatedconstant.OFF
607+
/// [`OFF`]: LevelFilter::OFF
609608
pub const fn into_level(self) -> Option<Level> {
610609
self.0
611610
}

tracing-core/src/span.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ pub struct Record<'a> {
3939
/// - "some", with the current span's [`Id`] and [`Metadata`].
4040
///
4141
/// [the `Subscriber` considers]: super::subscriber::Subscriber::current_span
42-
/// [`Id`]: Id
4342
/// [`Metadata`]: super::metadata::Metadata
4443
#[derive(Debug)]
4544
pub struct Current {
@@ -73,7 +72,7 @@ impl Id {
7372

7473
/// Constructs a new span ID from the given `NonZeroU64`.
7574
///
76-
/// Unlike [`Id::from_u64`](#method.from_u64), this will never panic.
75+
/// Unlike [`Id::from_u64`](Id::from_u64()), this will never panic.
7776
#[inline]
7877
pub const fn from_non_zero_u64(id: NonZeroU64) -> Self {
7978
Id(id)
@@ -273,9 +272,9 @@ impl Current {
273272
/// `None`, but in this case, that is because the subscriber does not keep
274273
/// track of the currently-entered span.
275274
///
276-
/// [`id`]: #method.id
277-
/// [`metadata`]: #method.metadata
278-
/// [`into_inner`]: #method.into_inner
275+
/// [`id`]: Current::id()
276+
/// [`metadata`]: Current::metadata()
277+
/// [`into_inner`]: Current::into_inner()
279278
pub fn is_known(&self) -> bool {
280279
!matches!(self.inner, CurrentInner::Unknown)
281280
}

tracing-core/src/subscriber.rs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,6 @@ use crate::stdlib::{
6767
/// [ID]: super::span::Id
6868
/// [`new_span`]: Subscriber::new_span
6969
/// [`register_callsite`]: Subscriber::register_callsite
70-
/// [`Interest`]: Interest
7170
/// [`enabled`]: Subscriber::enabled
7271
/// [`clone_span`]: Subscriber::clone_span
7372
/// [`try_close`]: Subscriber::try_close
@@ -136,10 +135,9 @@ pub trait Subscriber: 'static {
136135
/// _may_ still see spans and events originating from that callsite, if
137136
/// another subscriber expressed interest in it.
138137
///
139-
/// [filter]: #method.enabled
138+
/// [filter]: Subscriber::enabled()
140139
/// [metadata]: super::metadata::Metadata
141-
/// [`Interest`]: Interest
142-
/// [`enabled`]: #method.enabled
140+
/// [`enabled`]: Subscriber::enabled()
143141
/// [`rebuild_interest_cache`]: super::callsite::rebuild_interest_cache
144142
fn register_callsite(&self, metadata: &'static Metadata<'static>) -> Interest {
145143
if self.enabled(metadata) {
@@ -168,7 +166,7 @@ pub trait Subscriber: 'static {
168166
/// [metadata]: super::metadata::Metadata
169167
/// [interested]: Interest
170168
/// [`Interest::sometimes`]: Interest::sometimes
171-
/// [`register_callsite`]: #method.register_callsite
169+
/// [`register_callsite`]: Subscriber::register_callsite()
172170
fn enabled(&self, metadata: &Metadata<'_>) -> bool;
173171

174172
/// Returns the highest [verbosity level][level] that this `Subscriber` will
@@ -192,7 +190,6 @@ pub trait Subscriber: 'static {
192190
/// level changes.
193191
///
194192
/// [level]: super::Level
195-
/// [`Interest`]: Interest
196193
/// [rebuild]: super::callsite::rebuild_interest_cache
197194
fn max_level_hint(&self) -> Option<LevelFilter> {
198195
None

tracing-error/src/backtrace.rs

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -53,14 +53,13 @@ use tracing::{Metadata, Span};
5353
/// Additionally, if custom formatting is desired, the [`with_spans`] method can
5454
/// be used to visit each span in the trace, formatting them in order.
5555
///
56-
/// [`tracing`]: https://docs.rs/tracing
57-
/// [`Backtrace`]: https://doc.rust-lang.org/std/backtrace/struct.Backtrace.html
58-
/// [span]: https://docs.rs/tracing/latest/tracing/span/index.html
59-
/// [parents]: https://docs.rs/tracing/latest/tracing/span/index.html#span-relationships
60-
/// [fields]: https://docs.rs/tracing/latest/tracing/field/index.html
61-
/// [futures]: https://doc.rust-lang.org/std/future/trait.Future.html
56+
/// [`Backtrace`]: std::backtrace::Backtrace
57+
/// [span]: mod@tracing::span
58+
/// [parents]: mod@tracing::span#span-relationships
59+
/// [fields]: tracing::field
60+
/// [futures]: std::future::Future
6261
/// [`tracing-futures`]: https://docs.rs/tracing-futures/
63-
/// [`with_spans`]: #method.with_spans
62+
/// [`with_spans`]: SpanTrace::with_spans()
6463
#[derive(Clone)]
6564
pub struct SpanTrace {
6665
span: Span,
@@ -114,8 +113,8 @@ impl SpanTrace {
114113
/// indicate whether to continue iterating over spans; if it returns
115114
/// `false`, no additional spans will be visited.
116115
///
117-
/// [fields]: https://docs.rs/tracing/latest/tracing/field/index.html
118-
/// [`Metadata`]: https://docs.rs/tracing/latest/tracing/struct.Metadata.html
116+
/// [fields]: tracing::field
117+
/// [`Metadata`]: tracing::Metadata
119118
pub fn with_spans(&self, f: impl FnMut(&'static Metadata<'static>, &str) -> bool) {
120119
self.span.with_subscriber(|(id, s)| {
121120
if let Some(getcx) = s.downcast_ref::<WithContext>() {

tracing-error/src/layer.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@ use tracing_subscriber::{
1515
/// when formatting the fields of each span in a trace. When no formatter is
1616
/// provided, the [default format] is used instead.
1717
///
18-
/// [`Layer`]: https://docs.rs/tracing-subscriber/0.3/tracing_subscriber/layer/trait.Layer.html
18+
/// [`Layer`]: tracing_subscriber::layer::Layer
1919
/// [`SpanTrace`]: super::SpanTrace
20-
/// [field formatter]: https://docs.rs/tracing-subscriber/0.3/tracing_subscriber/fmt/trait.FormatFields.html
21-
/// [default format]: https://docs.rs/tracing-subscriber/0.3/tracing_subscriber/fmt/format/struct.DefaultFields.html
20+
/// [field formatter]: tracing_subscriber::fmt::FormatFields
21+
/// [default format]: tracing_subscriber::fmt::format::DefaultFields
2222
pub struct ErrorLayer<S, F = DefaultFields> {
2323
format: F,
2424

@@ -69,7 +69,7 @@ where
6969
{
7070
/// Returns a new `ErrorLayer` with the provided [field formatter].
7171
///
72-
/// [field formatter]: https://docs.rs/tracing-subscriber/0.2.10/tracing_subscriber/fmt/trait.FormatFields.html
72+
/// [field formatter]: tracing_subscriber::fmt::FormatFields
7373
pub fn new(format: F) -> Self {
7474
Self {
7575
format,

tracing-error/src/lib.rs

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -157,19 +157,12 @@
157157
//! }
158158
//! ```
159159
//!
160-
//! [`SpanTrace`]: SpanTrace
161-
//! [`ErrorLayer`]: ErrorLayer
162-
//! [`TracedError`]: TracedError
163-
//! [`InstrumentResult`]: InstrumentResult
164-
//! [`InstrumentError`]: InstrumentError
165-
//! [`ExtractSpanTrace`]: ExtractSpanTrace
166160
//! [`in_current_span()`]: InstrumentResult#tymethod.in_current_span
167-
//! [span]: https://docs.rs/tracing/latest/tracing/span/index.html
168-
//! [events]: https://docs.rs/tracing/latest/tracing/struct.Event.html
169-
//! [`Subscriber`]: https://docs.rs/tracing/latest/tracing/trait.Subscriber.html
170-
//! [subscriber layer]: https://docs.rs/tracing-subscriber/latest/tracing_subscriber/layer/trait.Layer.html
171-
//! [`tracing`]: https://docs.rs/tracing
172-
//! [`std::error::Error`]: https://doc.rust-lang.org/stable/std/error/trait.Error.html
161+
//! [span]: mod@tracing::span
162+
//! [events]: tracing::Event
163+
//! [`Subscriber`]: tracing::Subscriber
164+
//! [subscriber layer]: tracing_subscriber::layer::Layer
165+
//! [`tracing`]: tracing
173166
//!
174167
//! ## Supported Rust Versions
175168
//!

tracing-flame/src/lib.rs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -89,10 +89,7 @@
8989
//! the execution of your program. This representation is best created with a
9090
//! _flamechart_, which _does not_ sort or collapse identical stack frames.
9191
//!
92-
//! [`tracing`]: https://docs.rs/tracing
9392
//! [`inferno`]: https://docs.rs/inferno
94-
//! [`FlameLayer`]: FlameLayer
95-
//! [`FlushGuard`]: FlushGuard
9693
//! [`inferno-flamegraph`]: https://docs.rs/inferno/0.9.5/inferno/index.html#producing-a-flame-graph
9794
//!
9895
//! ## Supported Rust Versions
@@ -212,7 +209,6 @@ thread_local! {
212209
/// flush the writer.
213210
///
214211
/// [`flush_on_drop`]: FlameLayer::flush_on_drop
215-
/// [`FlushGuard`]: FlushGuard
216212
#[derive(Debug)]
217213
pub struct FlameLayer<S, W> {
218214
out: Arc<Mutex<W>>,

tracing-futures/src/lib.rs

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,8 @@
5252
//!
5353
//! The `tokio`, `std-future` and `std` features are enabled by default.
5454
//!
55-
//! [`tracing`]: https://crates.io/crates/tracing
56-
//! [span]: https://docs.rs/tracing/latest/tracing/span/index.html
57-
//! [`Subscriber`]: https://docs.rs/tracing/latest/tracing/subscriber/index.html
58-
//! [`Instrument`]: Instrument
59-
//! [`WithSubscriber`]: WithSubscriber
55+
//! [span]: tracing::span!
56+
//! [`Subscriber`]: tracing::subscriber
6057
//! [`futures`]: https://crates.io/crates/futures
6158
//!
6259
//! ## Supported Rust Versions
@@ -121,7 +118,7 @@ pub mod executor;
121118
/// Extension trait allowing futures, streams, sinks, and executors to be
122119
/// instrumented with a `tracing` [span].
123120
///
124-
/// [span]: https://docs.rs/tracing/latest/tracing/span/index.html
121+
/// [span]: mod@tracing::span
125122
pub trait Instrument: Sized {
126123
/// Instruments this type with the provided `Span`, returning an
127124
/// `Instrumented` wrapper.
@@ -150,7 +147,7 @@ pub trait Instrument: Sized {
150147
/// # }
151148
/// ```
152149
///
153-
/// [entered]: https://docs.rs/tracing/latest/tracing/span/struct.Span.html#method.enter
150+
/// [entered]: tracing::Span::enter
154151
fn instrument(self, span: Span) -> Instrumented<Self> {
155152
Instrumented { inner: self, span }
156153
}
@@ -185,8 +182,8 @@ pub trait Instrument: Sized {
185182
/// # }
186183
/// ```
187184
///
188-
/// [current]: https://docs.rs/tracing/latest/tracing/span/struct.Span.html#method.current
189-
/// [entered]: https://docs.rs/tracing/latest/tracing/span/struct.Span.html#method.enter
185+
/// [current]: tracing::Span::current
186+
/// [entered]: tracing::Span::enter
190187
#[inline]
191188
fn in_current_span(self) -> Instrumented<Self> {
192189
self.instrument(Span::current())
@@ -196,7 +193,7 @@ pub trait Instrument: Sized {
196193
/// Extension trait allowing futures, streams, and sinks to be instrumented with
197194
/// a `tracing` [`Subscriber`].
198195
///
199-
/// [`Subscriber`]: https://docs.rs/tracing/latest/tracing/subscriber/trait.Subscriber.html
196+
/// [`Subscriber`]: tracing::Subscriber
200197
#[cfg(feature = "std")]
201198
#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
202199
pub trait WithSubscriber: Sized {
@@ -208,8 +205,8 @@ pub trait WithSubscriber: Sized {
208205
/// When the wrapped type is an executor, the subscriber will be set as the
209206
/// default for any futures spawned on that executor.
210207
///
211-
/// [`Subscriber`]: https://docs.rs/tracing/latest/tracing/subscriber/trait.Subscriber.html
212-
/// [default]: https://docs.rs/tracing/latest/tracing/dispatcher/index.html#setting-the-default-subscriber
208+
/// [`Subscriber`]: tracing::Subscriber
209+
/// [default]: tracing::dispatcher#setting-the-default-subscriber
213210
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
214211
where
215212
S: Into<Dispatch>,
@@ -231,8 +228,8 @@ pub trait WithSubscriber: Sized {
231228
/// This can be used to propagate the current dispatcher context when
232229
/// spawning a new future.
233230
///
234-
/// [`Subscriber`]: https://docs.rs/tracing/latest/tracing/subscriber/trait.Subscriber.html
235-
/// [default]: https://docs.rs/tracing/latest/tracing/dispatcher/index.html#setting-the-default-subscriber
231+
/// [`Subscriber`]: tracing::Subscriber
232+
/// [default]: tracing::dispatcher#setting-the-default-subscriber
236233
#[inline]
237234
fn with_current_subscriber(self) -> WithDispatch<Self> {
238235
WithDispatch {

0 commit comments

Comments
 (0)